总结
以下知识点太密集,可以先了解场景,依靠场景去记忆头字段。后续遇到再加深印象。
1. 前提提要、场景
前面了解了 Header 头信息的基础规则和伪头,而 Header 包含了请求头、响应头。本章按照分类,大致介绍常见的请求头。
2. 控制相关
Host: 场景: traefik 网关管理,一个IP挂载多个子域名,通过Host区分来源域名,最终分配到不同服务上。Cache-Control:做为请求头字段时,控制客户端的缓存策略。Expect:目前规定只有Expect: 100-continue。场景:通知服务端,客户端即将发送大小为Content-Length的大文件- 能满足期望:
100(Continue) - 不能满足期望:
417(Expectation Failed)
- 能满足期望:
Range:指定范围请求,场景:用于断点续传或音视频传输- 范围有效:
206(Partial Content)响应。且在响应头中有对应的Content-Range: bytes 4697824-5091876/174754560(<type> <rangeStart>-<rangeEnd>/<total>) - 范围无效:
416(Range Not Satisfiable)错误。 - 服务器也可以忽略
Range并用200状态码返回整个资源
- 范围有效:
3. 条件相关
If-Match/If-None-Match/If-Modified-Since:304(Not Modified,未改变)/412 (Precondition Failed,前置条件失败)状态码相关If-Range/Range:206 (Partial Content,请求成功,部分内容)/416(Range Not Satisfiable,范围请求无法满足)状态码相关。
条件请求相关头部
If-Match:传递ETag值,ETag值匹配时才返回资源。GET/HEAD方法: 场景:搭配Range字段,可以用来保证【新请求的范围】与【之前请求的范围】是对同一份资源的请求。 不匹配返回416 (Range Not Satisfiable,范围请求无法满足),意味着服务端在这段期间资源有更新。PUT方法: 场景:更新资源,避免覆盖掉已更新内容。(跟git远程仓库有更新和本地仓库也有更改,避免覆盖而显示冲突很相似) 上传更新资源时,不匹配返回412 (Precondition Failed,前置条件失败),意味着服务端在这段期间资源有更新。
If-None-Match:传递ETag值,跟If-Match相反,ETag值没有匹配项才返回资源。优先级高于If-Modified-SinceGET/HEAD方法:场景:用来更新资源最新的ETag,且决定了客户端是否继续使用已缓存的资源- 不匹配,返回资源且返回最新的
ETag(也会尽可能返回Cache-Control、Content-Location、Date、Expires 和 Vary)。 - 匹配,返回响应码
304(Not Modified,未改变)。
- 不匹配,返回资源且返回最新的
PUT(或其它能够引发服务器状态改变的方法):场景:If-None-Match: *新增资源,避免覆盖资源。(If-Match目的是更新资源,如果不匹配ETag资源则412,而If-None-Match: *目的是新增资源,一但服务器有该资源,无论Etag返回412) 匹配,返回412(Precondition Failed,前置条件失败)。
If-Modified-Since:传递Last-Modified。资源在给定时间之后有更新才200返回资源。否则304(Not Modified,未改变)- 只能用于
GET/HEAD方法,场景:用于更新没有ETag的资源,因为If-Modified-Since优先级低于If-None-Match
- 只能用于
If-Range:条件请求,条件满足时Range头字段才起作用。- 场景:断点续传,用来确保下载的资源没有发生改变。否则重新下载
- 满足条件:返回
206 (Partial Content,请求成功,部分内容)并只返回Range限定的部分内容; - 条件不满足:返回
200并返回完整的请求资源If-Range: <ETag>:满足ETag同个资源时才会返回部分内容If-Range: <Last-Modified>:更改时间未超过限制,才会返回部分内容
- 与
If-Match的区别:If-Match在不匹配时返回416 (Range Not Satisfiable,范围请求无法满足),而If-Range在不匹配时返回新的整个资源。
4. 内容协商
内容类型(Accept)、文件编码(Accept-Encoding)、字符集类型 (Accept-Charset)、语言(Accept-Language) 。
场景:客户端向服务端描述需要怎样的资源,
- 满足:
200 - 不满足:
406 (Not Acceptable,不可接受)服务器端无法提供相匹配的资源。(可以通过一些配置不返回406如:Accept-Encoding: br;q=1.0, *;q=0)
请求头字段:
Accept:客户端可以处理的内容类型,MIME(媒体类型,一种标准)表示。如:application/json、application/javascript、text/html、image/png。Accept-Encoding:客户端可以处理的压缩编码,如:gzip、br,不配置则可能不压缩。Accept-Charset:客户端可以处理的字符集类型,如:utf-8、iso-8859-1Accept-Language:客户端需要的语言,如:en-US、zh-CN。
5. 认证相关
Authorization:每次发送请求时,使用该头部携带token信息,维护客户端的认证状态。
6. 来源相关
根据来源字段,场景:统计用户信息,也可以用来防止爬虫和防御 CSRF 攻击
Referer:来源页面的完整地址,即该页面是由哪个页面跳转而来的。(由于可能暴露用户的浏览历史,涉及隐私。有途径可以不发送改头信息,在不发送的情况下可以判断Origin)Origin:来源页面的协议、主机、端口(不会像Referer一样暴露path不会那么敏感),在跨域或同源(非GET和非HEAD) 请求中会带上Origin。User-Agent:用户代理,即客户端,比如浏览器版本号之类、命令行工具curl、http等